%{
   // #include "ts.h" /* Contains definition of ‘symrec'. */
   #include <stdio.h>
   #include "y.tab.h" // generado automaticamente por bison, sustituye el antiguo ts.h

   /*enum yytokentype {
   IDENTIFICADOR     = 256,		
   ENTERO            = 257,
   CHAR		     = 258,
   CONST	     = 259,
   INT		     = 265,
   INT1		     = 266,
   INT2		     = 267,
   INT3		     = 268,
   INT4		     = 269,
   INT5		     = 270,
   INT6		     = 271,
   INT7		     = 272,
   INT8		     = 273,
   VOID		     = 274,
   MAIN		     = 280,
   MALLOC	     = 285,
   DELETE	     = 286,
   IF                = 290,
   ELSE              = 291,
   SWITCH            = 295,
   CASE              = 296,
   BREAK             = 297,
   DEFAULT           = 300,
   DO                = 305,
   WHILE             = 306,
   FOR               = 310,
   RETURN	     = 315,
   CONTINUE	     = 316,
   EXIT	    	     = 320,
   PRINTF	     = 325,
   OPASIG            = 330,
   SUMA		     = 331,
   RESTA	     = 332,
   MULTIPLICACION    = 333,
   DIVISION	     = 334,
   MODULO	     = 335,
   SUMA_ASIG	     = 340,
   MULTIPLICA_ASIG   = 341,		
   OPLOG             = 342,
   MEN               = 343,
   MEI               = 344,
   MAY               = 345,		
   MAI               = 346,
   COMP              = 347,
   O_LOG	     = 348,
   Y_LOG	     = 349,
   NOT               = 350,
   DIF               = 351,
   INCREMENTO        = 355,
   DECREMENTO        = 356,
   COMA		     = 360,
   DOS_PUNTOS	     = 361,
   FIN_SENTENCIA     = 362,
   PARENTESIS_ABRE   = 365,
   PARENTESIS_CIERRA = 366,
   CORCHETE_ABRE     = 367,	
   CORCHETE_CIERRA   = 368,
   LLAVE_ABRE        = 369,
   LLAVE_CIERRA      = 370,
   O_BIT	     = 380,
   Y_BIT	     = 381,
   O_ASIGBIT	     = 382,
   Y_ASIGBIT	     = 383,
   COMENTARIO	     = 385,
   CADENA	     = 386

   };
*/
//   float yylval;
   
	/* Tabla de símbolos: Lista de nodos 'nodo_ts' */
//	token *ts;

%}

/* Universal Character Name: the naming conventions for UCS defined by International Standard ISO/IEC 10646 */
UCN     		(\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8})
obviar         [" " \n\t]+
letra_         [A-Za-z_]
digito         [0-9]
identificador  {letra_}({letra_}|{digito})*
entero         [+-]?{digito}+(\.{digito}*)?(E[+-]?{digito}+)?
real		   entero"."entero
cadena	       L?\"([^"\\]|\\['"?\\abfnrtv]|\\[0-7]{1,3}|\\[Xx][0-9a-fA-F]+|{UCN})*\"
incremento     [++]
decremento     [--]
/* %x commentaario */
comentario    ("/*"([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*"*"+"/")|("//".*)

%%

	/* --------------------------------- */
	/* 	  OPERADORES Y SIGNOS        */
	/* --------------------------------- */
"<="           { return(MEI); }
">"            { return(MAY); }
">="           { return(MAI); }
"<"            { return(MEN); }
"!="           { return(DIF); }
"!"            { return(NOT); }    
"=="           { return(COMP); }
"||"	       { return(O_LOG); }
"&&"	       { return(Y_LOG); }
"|"	       { return(O_BIT); }
"&"	       { return(Y_BIT); }
"="            { return ('='); }
"+"	       { return ('+'); }
"-"	       { return ('-'); }
"*"	       { return ('*'); }
"/"	       { return ('/'); }
"%"	       { return ('%'); }
"|="	       { return O_ASIGBIT; }
"&="	       { return Y_ASIGBIT; }
"+="	       { return SUMA_ASIG; }
"*="	       { return MULTIPLICA_ASIG; }
"++"           { return INCREMENTO; }
"--"           { return DECREMENTO; }
","	       { return (','); }
":"	       { return (':'); }
";"            { return (';'); }
"("            { return ('('); }
")"            { return (')'); }
"["	       { return ('['); }
"]"	       { return (']'); }
"{"            { return ('{'); }
"}"            { return ('}'); }

	/* --------------------------------- */
	/* 	   PALABRAS RESERVADAS	     */
	/* --------------------------------- */
if             { printf("<IF>\n");}
else           { printf("<ELSE>\n");}
switch         { printf("<SWITCH>\n");}
case           { printf("<CASE>\n");}
break          { printf("<BREAK>\n");}
default        { printf("<DEFAULT>\n");}
do             { printf("<DO>\n");}
while          { printf("<WHILE>\n");}
for            { printf("<FOR>\n");}
return	       { printf("<RETURN>\n");}
continue       { printf("<CONTINUE>\n");}
exit	       { printf("<EXIT>\n");}
printf	       { printf("<PRINTF>\n");}
char	       { printf("<CHAR>\n");}
const	       { printf("<CONST>\n");}
int	       { printf("<INT>\n");}
int1	       { printf("<INT1>\n");}
int2	       { printf("<INT2>\n");}
int3	       { printf("<INT3>\n");}
int4	       { printf("<INT4>\n");}
int5	       { printf("<INT5>\n");}
int6	       { printf("<INT6>\n");}
int7	       { printf("<INT7>\n");}
int8	       { printf("<INT8>\n");}
void	       { printf("<VOID>\n");}
main	       { printf("<MAIN>\n");}
malloc	       { printf("<MALLOC>\n");}
delete	       { printf("<DELETE>\n");}

	/* --------------------------------- */
	/* 	      IDENTIFICADORES	     */
	/* --------------------------------- */
{identificador}     { return IDENTIFICADOR; }

	/* --------------------------------- */
	/* 	      LITERALES		     */
	/* --------------------------------- */
{obviar}       { }
{real}         { }
{entero}       { yylval = atof(yytext); return ENTERO; }
{cadena}       { return CADENA;}
{comentario}   { return COMENTARIO; }

%%


